﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bastanteo.Domain;
using System.Data.SqlClient;

namespace Bastanteo.Persistencia.ADO
{
    public class UsuarioDAO : IUsuarioDAO
    {
        // Dependencias
        IRolDAO rolDAO = new RolDAO();

        // Métodos CRUD
        public Usuario Crear(Usuario usuarioACrear)
        {
            string _Sentencia = @"Insert into Usuarios (UsuarioID, Codigo, Usuario, Password, RolID) 
                                  values (@UsuarioID, @Codigo, @Usuario, @Password, @RolID)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@UsuarioID", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@Codigo", usuarioACrear.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@Usuario", usuarioACrear.usuario));
                    _Comando.Parameters.Add(new SqlParameter("@Password", usuarioACrear.Password));
                    _Comando.Parameters.Add(new SqlParameter("@RolID", usuarioACrear.Rol.RolId));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Usuario Obtener(int codigo)
        {
            string _Sentencia = @"SELECT UsuarioID, Codigo, Usuario, Password, RolID FROM Usuarios WHERE UsuarioID=@UsuarioID";
            Usuario usuarioCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@UsuarioID", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            usuarioCreado = new Usuario();
                            usuarioCreado.UsuarioId = (int)_Resultado["UsuarioID"];
                            usuarioCreado.Codigo = (string)_Resultado["Codigo"];
                            usuarioCreado.usuario = (string)_Resultado["Usuario"];
                            usuarioCreado.Password = (string)_Resultado["Password"];
                            usuarioCreado.Rol = rolDAO.Obtener((int)_Resultado["RolID"]);
                        }
                    }
                }
            }
            return usuarioCreado;
        }
        public Usuario Modificar(Usuario usuarioAModificar)
        {
            string _Sentencia = @"Update Usuarios SET Codigo=@Codigo, Usuario=@Usuario, Password=@Password, RolID=@RolID 
                                  Where UsuarioID=@UsuarioID";
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@Codigo", usuarioAModificar.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@Usuario", usuarioAModificar.usuario));
                    _Comando.Parameters.Add(new SqlParameter("@Password", usuarioAModificar.Password));
                    _Comando.Parameters.Add(new SqlParameter("@RolID", usuarioAModificar.Rol.RolId));
                    _Comando.Parameters.Add(new SqlParameter("@UsuarioID", usuarioAModificar.UsuarioId));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(usuarioAModificar.UsuarioId);
        }
        public void Eliminar(Usuario usuarioAEliminar)
        {
            string _Sentencia = "DELETE FROM Usuarios WHERE UsuarioID=@UsuarioID";
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@UsuarioID", usuarioAEliminar.UsuarioId));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Usuario> Listar()
        {
            string _Sentencia = @"SELECT UsuarioID, Codigo, Usuario, Password, RolID FROM Usuarios";
            ICollection<Usuario> usuariosEncontrados = new List<Usuario>();
            Usuario usuarioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            usuarioEncontrado = new Usuario();
                            usuarioEncontrado.UsuarioId = (int)_Resultado["UsuarioID"];
                            usuarioEncontrado.Codigo = (string)_Resultado["Codigo"];
                            usuarioEncontrado.usuario = (string)_Resultado["Usuario"];
                            usuarioEncontrado.Password = (string)_Resultado["Password"];
                            usuarioEncontrado.Rol = rolDAO.Obtener((int)_Resultado["RolID"]);
                            usuariosEncontrados.Add(usuarioEncontrado);
                        }
                    }
                }
            }
            return usuariosEncontrados;
        }
        public ICollection<Usuario> ListarXBusqueda(string codigo, string usuario, Rol rol)
        {
            string _Sentencia = @"SELECT UsuarioID, Codigo, Usuario, Password, RolID FROM Usuarios WHERE 1=1";
            ICollection<Usuario> usuariosEncontrados = new List<Usuario>();
            Usuario usuarioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND Codigo=@Codigo";
                        _Comando.Parameters.Add(new SqlParameter("@Codigo", codigo));
                    }
                    if (usuario != null)
                    {
                        _Sentencia = _Sentencia + " AND Usuario LIKE '%'+@Usuario+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@Usuario", usuario));
                    }
                    if (rol != null)
                    {
                        _Sentencia = _Sentencia + " AND RolID=@RolID";
                        _Comando.Parameters.Add(new SqlParameter("@RolID", rol.RolId));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            usuarioEncontrado = new Usuario();
                            usuarioEncontrado.UsuarioId = (int)_Resultado["UsuarioId"];
                            usuarioEncontrado.Codigo = (string)_Resultado["Codigo"];
                            usuarioEncontrado.usuario = (string)_Resultado["usuario"];
                            usuarioEncontrado.Password = (string)_Resultado["Password"];
                            usuarioEncontrado.Rol = rolDAO.Obtener((int)_Resultado["RolID"]);
                            usuariosEncontrados.Add(usuarioEncontrado);
                        }
                    }
                }
            }
            return usuariosEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(UsuarioID) FROM Usuarios";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}